/* eslint-disable no-useless-escape */

const REGEX_HUB_PATTERNS = [
  {
    name: 'Date in format dd/mm/yyyy',
    regex: /^(0?[1-9]|[12][0-9]|3[01])([ /\-])(0?[1-9]|1[012])\2([0-9][0-9][0-9][0-9])(([ -])([0-1]?[0-9]|2[0-3]):[0-5]?[0-9]:[0-5]?[0-9])?$/,
    description: 'Will match dates with dashes, slashes or with spaces (e.g. dd-mm-yyyy dd/mm/yyyy dd mm yyyy), and optional time separated by a space or a dash (e.g. dd-mm-yyyy-hh:mm:ss or dd/mm/yyyy hh:mm:ss).',
    tags: 'date,time',
  },
  {
    name: 'Time in 24-hour format',
    regex: /^([01]?[0-9]|2[0-3]):[0-5][0-9]$/,
    description: 'Match times in 24 hour format',
    tags: 'date,time',
  },
  {
    name: 'Date and time in ISO-8601 format',
    regex: /^(?![+-]?\d{4,5}-?(?:\d{2}|W\d{2})T)(?:|(\d{4}|[+-]\d{5})-?(?:|(0\d|1[0-2])(?:|-?([0-2]\d|3[0-1]))|([0-2]\d{2}|3[0-5]\d|36[0-6])|W([0-4]\d|5[0-3])(?:|-?([1-7])))(?:(?!\d)|T(?=\d)))(?:|([01]\d|2[0-4])(?:|:?([0-5]\d)(?:|:?([0-5]\d)(?:|\.(\d{3})))(?:|[zZ]|([+-](?:[01]\d|2[0-4]))(?:|:?([0-5]\d)))))$/,
    description: 'Will match a valid date and times in the ISO-8601 format, excludes durations.',
    tags: 'date,time',
  },
  {
    name: 'HTML tags',
    regex: /^<([a-z1-6]+)([^<]+)*(?:>(.*)<\/\1>| *\/>)$/,
    description: 'Match opening and closing HTML tags with content between',
    tags: 'markup,xml,html',
  },
  {
    name: 'Username',
    regex: /^[a-zA-Z0-9_-]{3,16}$/,
    description: 'A string between 3 and 16 characters, allowing alphanumeric characters and hyphens and underscores',
    tags: 'username,validation',
  },
  {
    name: 'Hex Color Value',
    regex: /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/,
    description: 'RGB hex colors',
    tags: 'hex,color',
  },
  {
    name: 'URL Slug',
    regex: /^[a-z0-9-]+$/,
    description: 'Match valid URL slugs',
    tags: 'URL',
  },
  {
    name: 'Email',
    regex: /^.+@.+$/,
    description: 'Verify that there is an @ symbol with something before it',
    tags: 'email,validation',
  },
  {
    name: 'SRC of image tag',
    regex: /^<\s*img[^>]+src\s*=\s*(["'])(.*?)\1[^>]*>$/,
    description: 'Match the src attribute of an HTML image tag',
    tags: 'html,tag,image',
  },
  {
    name: 'URL',
    regex: /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/,
    description: 'Match URL with optional protocol',
    tags: 'url,address,http',
  },
  {
    name: 'IPv4 Address',
    regex: /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,
    description: 'Match IP v4 addresses',
    tags: 'tcpip,internet,address',
  },
  {
    name: 'IPv6 Address',
    regex: /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/,
    description: 'Match IP v6 addresses',
    tags: 'tcpip,internet,address',
  },
  {
    name: 'Positive Integer',
    regex: /^\d+$/,
    descriptions: 'Match whole numbers above zero',
    tags: 'number',
  },
  {
    name: 'Negative Integer',
    regex: /^-\d+$/,
    description: 'Match whole numbers below zero',
    tags: 'number',
  },
  {
    name: 'Integer',
    regex: /^-?\d+$/,
    description: 'Match whole numbers, above or below zero',
    tags: 'number',
  },
  {
    name: 'Positive number',
    regex: /^\d*\.?\d+$/,
    description: 'Match integers or floats that are positive',
    tags: 'float',
  },
  {
    name: 'Negative number',
    regex: /^-\d*\.?\d+$/,
    description: 'Match integers or floats that are negative',
    tags: 'float',
  },
  {
    name: 'Positive or negative number',
    regex: /^-?\d*\.?\d+$/,
    description: 'Match integers or floats that are positive or negative',
    tags: 'float',
  },
  {
    name: 'Phone number',
    regex: /^\+?(\d.*){3,}$/,
    description: 'Match phone numbers at least 3 digits long',
    tags: 'validation',
  },
  {
    name: 'New line',
    regex: /[\r\n]|$/,
    description: 'Match new lines within text',
    tags: 'text',
  },
  {
    name: 'ID of Youtube video',
    regex: /https?:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/gi,
    description: 'Match the ID of a youtube video URL',
    tags: 'video,youtube,url',
  },
  {
    name: 'ID of Youtube Channel',
    regex: /https?:\/\/(www\.)?youtube.com\/channel\/UC([-_a-z0-9]{22})/i,
    description: 'Match the ID of a youtube channel URL',
    tags: 'channel,youtube,url',
  },
  {
    name: 'CSS comment',
    regex: /\/\*[^*]*\*+([^/*][^*]*\*+)*\//,
    description: 'Match standard CSS comments',
    tags: 'css,comment,code',
  },
  {
    name: 'Wordpress shortcodes',
    regex: /^\[([a-z-_0-9]+)([^\[]+)*(?:\](.*)\[\/\1\]|\s+\/\])$/,
    description: 'Matches opening and closing shortcode tags with content in-between them.',
    tags: 'wordpress,shortcodes,markup',
  },
  {
    name: 'U.S./Canadian ZIP/Postal Code',
    regex: /(^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$)/,
    description: 'Matches US ZIP, ZIP+4, and Canadian Postal Codes',
    tags: 'address, postal, zip',
  },
  {
    name: 'UK Postal Code',
    regex: /^(([gG][iI][rR] {0,}0[aA]{2})|(([aA][sS][cC][nN]|[sS][tT][hH][lL]|[tT][dD][cC][uU]|[bB][bB][nN][dD]|[bB][iI][qQ][qQ]|[fF][iI][qQ][qQ]|[pP][cC][rR][nN]|[sS][iI][qQ][qQ]|[iT][kK][cC][aA]) {0,}1[zZ]{2})|((([a-pr-uwyzA-PR-UWYZ][a-hk-yxA-HK-XY]?[0-9][0-9]?)|(([a-pr-uwyzA-PR-UWYZ][0-9][a-hjkstuwA-HJKSTUW])|([a-pr-uwyzA-PR-UWYZ][a-hk-yA-HK-Y][0-9][abehmnprv-yABEHMNPRV-Y]))) {0,}[0-9][abd-hjlnp-uw-zABD-HJLNP-UW-Z]{2}))$/,
    description: 'Matches all UK postcodes',
    tags: 'address, postal, zip',
  },
  {
    name: 'Brazilian ZIP/Postal Code',
    regex: /^[0-9]{5}-[0-9]{3}$/,
    description: 'Matches BR ZIP/Postal Code',
    tags: 'address, postal, zip',
  },
  {
    name: 'Morse Code',
    regex: /^[.-]{1,5}(?:[ \t]+[.-]{1,5})*(?:[ \t]+[.-]{1,5}(?:[ \t]+[.-]{1,5})*)*$/,
    description: 'Matches valid Morse Code',
    tags: 'morse, code',
  },
  {
    name: 'Image shortcode',
    regex: /\[img\](.*?)\[\/img\]/,
    description: 'Matches the content in between [img][/img]. Useful for making dynamic WYSIWYG editors',
    tags: 'img, shortcode, wysiwyg',
  },
  {
    name: 'Brainfuck Code',
    regex: /^[+-<>.,\[\] \t\n\r]+$/,
    description: 'Matches valid code for a brainfuck program.',
    tags: 'brainfuck, code',
  },
];

export default REGEX_HUB_PATTERNS;
